Hellforge General Crackme IV
by LaZaRuS


Tutorial de Lucifer48 [Immortal Descendants]
(16 juillet 1999)



Ce crackme a ΘtΘ compilΘ par un compilateur inconnu (RHG-Profan). Pour ma part, je trouve que τa ressemble un peu α du delphi dans le sens o∙ il y a trΦs peu d'appel α l'api, et des call sont appΘlΘs α plusieurs reprises pour diverses raisons. Allons y ! Voilα deux faτons d'entrer dans le code: bpx MessageBoxA ou bpx Hmemcpy.
XXXX:00421582  PUSH EBP
XXXX:00421583  CALL 0041D35C             ;lit le nom, puis ensuite le serial (*)
XXXX:00421588  POP  ECX
XXXX:00421589  JMP  00421907
...
XXXX:0042159A  PUSH EBP
XXXX:0042159B  CALL 0041E3C4             ;mauvais serial (affiche la MessageBoxA)
(*) Ce call est appΘlΘ deux fois, la premiΦre fois le nom est lu (via SendMessageA, ce n'est pas une dialog box), la deuxiΦme fois c'est le serial.

Dans le call 0041D35C:
...
XXXX:0041D3C7  MOV  EDX,[EBP-0104]       ;le nom (se termine par un caractΦre nul)
XXXX:0041D3CD  MOV  EAX,00430518         ;destination (voir remarque)
XXXX:0041D3D2  MOV  ECX,000000FF         ;255 caractΦres maximun
XXXX:0041D3D7  CALL 00403AC8
Remarque: En 00430518, le nom aura ce format (taille du nom suivi du nom):
-----CRACKME!BSS+1518------------------------------byte--------------PROT---(0)--
XXXX:004305018 09 4C 75 63 69 66 65 72-34 38                    .Lucifer48......
---------------------------------------------------------------------------------
Plus tard, α ce mΩme endroit (00430518), le serial sera lu et aura la mΩme disposition. J'ai donc dΘcidΘ de mettre un petit breakpoint (BPM 004305018 W) pour voir ce qui ce passe.
Voilα le rΘsultat partiel (voilα tour α tour le chaεnes de caractΦres qui sont copiΘes):

Lucifer48
name$
Lucifer48
serial2%
1234
serial2%
SERIAL
5678
serial2%
SERIAL
16784                      ;<------ the right serial !!
serial%
36157800                   ;comparaison avec mon serial (faite aprΦs la crΘation du bon serial)
That was wrong
D'ou sort ce serial ?? Comment est-il calculΘ ?? Nous allons regarder ce qui ce passe lors de la recopie du serial. C'est ici:
XXXX:00402D7A  MOV  AL,[EBX+ESP-01]      ;ebx=5
XXXX:00402D7E  MOV  [EDI],AL             ;edi=0043051x
XXXX:00402D80  INC  EDI
XXXX:00402D81  DEC  EBX
XXXX:00402D82  JNZ  00402D7A
(attention cette "routine" sert α plusieurs reprises...)
Et juste au dessus:
XXXX:00402D3C  MOV  ECX,0000000A
XXXX:00402D41  XOR  EBX,EBX
XXXX:00402D43  XOR  EDX,EDX
XXXX:00402D45  DIV  ECX                  ;conversion hΘxadΘcimal -> dΘcimal
XXXX:00402D47  ADD  EDX,30
XXXX:00402D4A  MOV  [EBX+ESP],DL
XXXX:00402D4D  INC  EBX
XXXX:00402D4E  TEST EAX,EAX
Pour mon nom j'ai 16784 = 4190h d'o∙ sort ce 4190h ???
Je dΘcouvre que, seul la longueur du nom est importante !

* 1 caractΦre, (1B00h), serial/ 6912
* 2 caractΦres, (1FD2h), serial/ 8146
* 3 caractΦres, (24A4h), serial/ 9380
...
* 9 caractΦres, (4190h), serial/ 16784

Et donc..... serial = 5678 + 1234*(taille-du-nom)

239ko pour τa !!!!!!

Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN, Duelist, LaZaRuS, people on #cracking4newbies, french crackers, and other crackme makers.



(c) Lucifer48. All rights reversed